home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir24 / psi110g.zip / TTYLINK.C < prev    next >
C/C++ Source or Header  |  1994-04-17  |  3KB  |  127 lines

  1. /* Internet TTY "link" (keyboard chat) server
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <time.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "telnet.h"
  9. #include "session.h"
  10. #include "proc.h"
  11. #include "tty.h"
  12. #include "mailbox.h"
  13. #include "commands.h"
  14.   
  15. #if !defined MAILBOX || defined TTYLINKSERVER || defined TTYCALL
  16.   
  17. extern int Attended;
  18. static char Tnbanner[] = "Welcome to TTY-Link at %s\n";
  19. extern char SysopBusy[];
  20. extern int Numrows,Numcols;
  21.   
  22. /* A little wrapper for tcp connections to ttylink */
  23. void
  24. ttylink_tcp(int s,void *t,void *p) {
  25.     ttylhandle(s,(void *)TELNET,p);
  26. }
  27.   
  28. /* This function handles all incoming "chat" sessions, be they TCP,
  29.  * NET/ROM or AX.25
  30.  */
  31. void
  32. ttylhandle(s,t,p)
  33. int s;
  34. void *t;
  35. void *p;
  36. {
  37.     int type,index;
  38.     struct session *sp;
  39.     char addr[MAXSOCKSIZE];
  40.     int len = MAXSOCKSIZE;
  41.     struct telnet tn;
  42.     extern char *Motd;
  43.     time_t nowtime;
  44.   
  45.     /* Check for enough mem for new screen - WG7J */
  46.     if(availmem() < Memthresh+(2*Numrows*Numcols)){
  47.         usputs(s,"System is overloaded; try again later\r\n");
  48.         close_s(s);
  49.         return;
  50.     } else if(!Attended){
  51.         usputs(s,SysopBusy);
  52.         close_s(s);
  53.         return;
  54.     }
  55.   
  56.     type = (int) t;
  57.     sockmode(s,SOCK_ASCII);
  58.     sockowner(s,Curproc);   /* We own it now */
  59.     log(s,"open %s",Sestypes[type]);
  60.   
  61.     /* Allocate a session descriptor */
  62.     if((sp = newsession(NULLCHAR,type,1)) == NULLSESSION){
  63.         usputs(s,TooManySessions);
  64.         close_s(s);
  65.         return;
  66.     }
  67.     index = (unsigned int) (sp - Sessions);
  68.   
  69.     /* Initialize a Telnet protocol descriptor */
  70.     memset((char *)&tn,0,sizeof(tn));
  71.     tn.session = sp;    /* Upward pointer */
  72.     sp->cb.telnet = &tn;    /* Downward pointer */
  73.     sp->s = s;
  74.     sp->proc = Curproc;
  75.   
  76.     time(&nowtime);     /* current time */
  77.   
  78.     getpeername(s,addr,&len);
  79.     tprintf("\007Incoming %s session %u from %s on %s",
  80.     Sestypes[type],index,psocket(addr),ctime(&nowtime));
  81.   
  82.     usprintf(s, Tnbanner, Hostname);
  83.     if(Motd != NULLCHAR)
  84.         usputs(s,Motd);
  85.   
  86.     tnrecv(&tn);
  87. }
  88.   
  89. #endif /* !MAILBOX || TTYLINKSERVER || TTYCALL */
  90.   
  91. #ifdef TTYLINKSERVER
  92.   
  93. int
  94. ttylstart(argc,argv,p)
  95. int argc;
  96. char *argv[];
  97. void *p;
  98. {
  99.     int16 port;
  100.   
  101.     if(argc < 2)
  102.         port = IPPORT_TTYLINK;
  103.     else
  104.         port = atoi(argv[1]);
  105.   
  106.     return start_tcp(port,"TTYLINK Server",ttylink_tcp,2048);
  107. }
  108.   
  109. /* Shut down Ttylink server */
  110. int
  111. ttyl0(argc,argv,p)
  112. int argc;
  113. char *argv[];
  114. void *p;
  115. {
  116.     int16 port;
  117.   
  118.     if(argc < 2)
  119.         port = IPPORT_TTYLINK;
  120.     else
  121.         port = atoi(argv[1]);
  122.     return stop_tcp(port);
  123. }
  124.   
  125. #endif /* TTYLINKSERVER */
  126.   
  127.